﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ZOVNP.Model.Abstracts;

namespace ZOVNP.Engine
{
    /// <summary> Менеджер занесения новых объектов в контекст. </summary>
    /// <remarks>
    /// Одной из целей создания этого класса было вынесение всех методов создания новых объектов в отдельный класс, чтобы не захламлять ими класс контекста.
    /// </remarks>
    internal class ContextAdder : IContextAdder
    {
        #region Поля

        private ZOVNPContext entities;

        #endregion

        #region Конструкторы

        /// <summary> Создать менеджер. </summary>
        /// <param name="Entities"> Контекст, в пределах которого функционирует данный менеджер. </param>
        public ContextAdder(ZOVNPContext Entities)
        {
            entities = Entities;
        }

        #endregion

        #region Методы

        public void AddCustomer(ICustomer customer)
        {
            var entityObject = (Customer)customer;
            entities.Customers.AddObject(entityObject);
            OnEntityAdded(entityObject);
        }

        public void AddOrder(IOrder order)
        {
            var entityObject = (Order)order;
            entities.Orders.AddObject(entityObject);
            OnEntityAdded(entityObject);
        }

        public void AddOrderPart(IOrderPart orderPart)
        {
            var entityObject = (OrderPart)orderPart;
            entities.OrderParts.AddObject(entityObject);
            OnEntityAdded(entityObject);
        }

        public void AddOrderItem(IOrderItem order)
        {
            var entityObject = (OrderItem)order;
            entities.OrderItems.AddObject(entityObject);
            OnEntityAdded(entityObject);
        }

        /// <summary> Сгенерировать уникальный идентификатор. </summary>
        /// <remarks> Этот метод должен использоваться для генерации идентификаторов создаваемых доменных объектов. </remarks>
        /// <returns> Уникальный идентификатор. </returns>
        private Guid NewGuid() { return entities.Engine.NewGuid(); }

        /// <summary> Срабатывает каждый раз после непосредственного вызова конструктора доменного объекта и перед его добавлением в контекст. </summary>
        /// <param name="Entity"> Созданный доменный оъект. </param>
        private static void OnEntityCreated(DomainObject Entity)
        {
        }

        /// <summary> Срабатывает каждый раз после добавления доменного объекта в контекст. </summary>
        /// <param name="Entity"> Добавленный в контекст доменный оъект. </param>
        private void OnEntityAdded(DomainObject Entity)
        {
            Entity.Context = entities;
        }

        #endregion
    }
}
